
[dbo].[amsp_CMMoveNavMenu]
CREATE PROCEDURE amsp_CMMoveNavMenu
@InMoveNavMenuID numeric,
@InTargetNavMenuID numeric = NULL,
@InMovePromoteDemoteInd char(1) = 'M',
@InMoveLevel varchar(10) = NULL,
@OutErrorMessage varchar(255) OUTPUT
AS
BEGIN
DECLARE
@WebsiteKey uniqueidentifier,
@MinSort numeric(28,18),
@MaxSort numeric(28,18),
@NavContentGroupInd char(1),
@Move_ParentNavMenuID numeric,
@Move_AncestorNavMenuID numeric,
@Move_CategoryDepth numeric,
@Move_ParentName varchar(255),
@Move_SortOrder numeric(28,18),
@Target_CategoryDepth numeric,
@Target_SortOrder numeric(28,18),
@Target_AncestorNavMenuID numeric,
@Target_ParentNavMenuID numeric,
@LowestSortOrder numeric(28,18),
@Below_SortOrder numeric(28,18),
@IncrementValue numeric(28,18),
@DescendantCount integer,
@Counter integer,
@Loop_NavMenuID numeric,
@Loop_SortOrder numeric(28,18),
@Loop_LowestSortOrder numeric(28,18),
@New_SortOrder numeric(28,18),
@New_ParentNavMenuID numeric,
@New_AncestorNavMenuID numeric,
@New_CategoryDepth numeric,
@IsTargetDescendant bit,
@Sib_NavMenuID numeric,
@Sib_SortOrder numeric(28,18),
@Level varchar(10),
@Error integer
EXEC amsp_CMNavMenuRenum
SELECT @Move_ParentNavMenuID = a.ParentNavMenuID,
@Move_AncestorNavMenuID = a.AncestorNavMenuID,
@Move_CategoryDepth = a.CategoryDepth,
@Move_ParentName = b.Name,
@Move_SortOrder = a.SortOrder,
@NavContentGroupInd = a.NavContentGroupInd,
@WebsiteKey = a.WebsiteKey
FROM Nav_Menu a WITH (NOLOCK) LEFT OUTER JOIN Nav_Menu b WITH (NOLOCK)
ON a.ParentNavMenuID = b.NavMenuID
WHERE a.NavMenuID = @InMoveNavMenuID
IF @@Rowcount = 0
RETURN
IF @InMovePromoteDemoteInd = 'P' BEGIN
SELECT TOP 1 @InTargetNavMenuID = NavMenuID
FROM Nav_Menu WITH (NOLOCK)
WHERE CategoryDepth = @Move_CategoryDepth - 1
AND SortOrder < @Move_SortOrder
AND NavContentGroupInd = @NavContentGroupInd
ORDER BY SortOrder DESC
SET @Level = 'Same'
END
ELSE IF @InMovePromoteDemoteInd = 'D' BEGIN
SELECT TOP 1
@Sib_NavMenuID = NavMenuID,
@Sib_SortOrder = SortOrder
FROM Nav_Menu WITH (NOLOCK)
WHERE CategoryDepth = @Move_CategoryDepth
AND SortOrder < @Move_SortOrder
AND NavContentGroupInd = @NavContentGroupInd
ORDER BY SortOrder DESC
SELECT TOP 1
@InTargetNavMenuID = NavMenuID
FROM Nav_Menu WITH (NOLOCK)
WHERE CategoryDepth = @Move_CategoryDepth + 1
AND SortOrder < @Move_SortOrder
AND SortOrder > @Sib_SortOrder
AND NavContentGroupInd = @NavContentGroupInd
ORDER BY SortOrder DESC
IF @@Rowcount > 0
SET @Level = 'Same'
ELSE BEGIN
SET @InTargetNavMenuID = @Sib_NavMenuID
SET @Level = 'Lower'
END
END
ELSE IF @InMoveLevel IS NOT NULL
SET @Level = @InMoveLevel
ELSE
SET @Level = 'Same'
IF @InMoveNavMenuID = @InTargetNavMenuID
SET @OutErrorMessage = 'Error! The target item can''t be the item you want to move.'
IF @InTargetNavMenuID IS NULL
SET @OutErrorMessage = 'Error! Can''t find the target item.'
IF @OutErrorMessage IS NULL BEGIN
SELECT @MinSort = a.SortOrder,
@MaxSort = (SELECT IsNull(Min(x.SortOrder),0)
FROM Nav_Menu x
WITH (NOLOCK)
WHERE x.SortOrder > a.SortOrder
AND x.CategoryDepth <= a.CategoryDepth)
FROM Nav_Menu a WITH (NOLOCK)
WHERE a.NavMenuID = @InMoveNavMenuID
SELECT a.NavMenuID, a.SortOrder
INTO #Descendants
FROM Nav_Menu a WITH (NOLOCK)
WHERE a.SortOrder > @MinSort
AND a.SortOrder < @MaxSort
SET @DescendantCount = @@Rowcount
SELECT 1
FROM #Descendants
WHERE NavMenuID = @InTargetNavMenuID
IF @@Rowcount >= 1
SET @OutErrorMessage = 'Error! The target item can''t be a descendant of the item you want to move.'
END
IF @OutErrorMessage IS NULL BEGIN
SELECT @Target_CategoryDepth = a.CategoryDepth,
@Target_SortOrder = a.SortOrder,
@Target_AncestorNavMenuID = a.AncestorNavMenuID,
@Target_ParentNavMenuID = a.ParentNavMenuID
FROM Nav_Menu a WITH (NOLOCK)
WHERE NavMenuID = @InTargetNavMenuID
IF @@Rowcount = 0
RETURN
SET @LowestSortOrder = @Target_SortOrder
IF @Target_AncestorNavMenuID IS NOT NULL BEGIN
SELECT @MinSort = a.SortOrder,
@MaxSort = (SELECT IsNull(Min(x.SortOrder),0)
FROM Nav_Menu x
WITH (NOLOCK)
WHERE x.SortOrder > a.SortOrder
AND x.CategoryDepth <= a.CategoryDepth)
FROM Nav_Menu a WITH (NOLOCK)
WHERE a.NavMenuID = @InTargetNavMenuID
SELECT a.NavMenuID, a.SortOrder
INTO #TargetDescendants
FROM Nav_Menu a WITH (NOLOCK)
WHERE a.SortOrder > @MinSort
AND a.SortOrder < @MaxSort
ORDER BY a.SortOrder
IF @@RowCount > 0
SELECT @LowestSortOrder = Max(SortOrder)
FROM #TargetDescendants
END
ELSE
SET @Level = 'Lower'
SELECT TOP 1 @Below_SortOrder = SortOrder
FROM Nav_Menu WITH (NOLOCK)
WHERE SortOrder > @LowestSortOrder
ORDER BY SortOrder
DECLARE c_Descendant CURSOR LOCAL SCROLL FOR
SELECT NavMenuID, SortOrder
FROM #Descendants
ORDER BY SortOrder
SET @Counter = 1
SET @New_SortOrder = @Move_SortOrder
SET @New_ParentNavMenuID = @Move_ParentNavMenuID
SET @New_AncestorNavMenuID = @Move_AncestorNavMenuID
SET @New_CategoryDepth = @Move_CategoryDepth
IF @Level = 'Same' BEGIN
IF @Target_CategoryDepth = 1 BEGIN
IF @Move_CategoryDepth = 1 BEGIN
print 'case 1'
SET @New_SortOrder = (@LowestSortOrder + @Below_SortOrder)/2
END
ELSE BEGIN
print 'case 2'
SET @New_ParentNavMenuID = NULL
SET @New_AncestorNavMenuID = @InMoveNavMenuID
SET @New_CategoryDepth = @Target_CategoryDepth
SET @New_SortOrder = (@LowestSortOrder + @Below_SortOrder)/2
END
END
ELSE BEGIN
print 'case 3'
SET @New_ParentNavMenuID = @Target_ParentNavMenuID
SET @New_AncestorNavMenuID = @Target_AncestorNavMenuID
SET @New_CategoryDepth = @Target_CategoryDepth
SET @New_SortOrder = (@LowestSortOrder + @Below_SortOrder)/2
END
END
ELSE IF @Level = 'Lower' BEGIN
IF @Target_CategoryDepth = 0 BEGIN
IF @NavContentGroupInd = 'N'
SELECT TOP 1 @Below_SortOrder = SortOrder
FROM Nav_Menu
WHERE CategoryDepth = 1
AND NavContentGroupInd = @NavContentGroupInd
AND WebsiteKey = @WebsiteKey
AND NavMenuID <> @InMoveNavMenuID
ORDER BY SortOrder
ELSE
SELECT TOP 1 @Below_SortOrder = SortOrder
FROM Nav_Menu
WHERE CategoryDepth = 1
AND NavContentGroupInd = @NavContentGroupInd
AND NavMenuID <> @InMoveNavMenuID
ORDER BY SortOrder
print 'case 4'
SET @Target_CategoryDepth = 1
SET @New_ParentNavMenuID = NULL
SET @New_AncestorNavMenuID = @InMoveNavMenuID
SET @New_CategoryDepth = @Target_CategoryDepth
SET @New_SortOrder = @Target_SortOrder + (@Below_SortOrder - @Target_SortOrder)/2
END
ELSE BEGIN
IF @Move_CategoryDepth = 1 BEGIN
print 'case 5'
SET @New_ParentNavMenuID = @InTargetNavMenuID
SET @New_AncestorNavMenuID = @Target_AncestorNavMenuID
SET @New_CategoryDepth = @Target_CategoryDepth + 1
SET @New_SortOrder = (@LowestSortOrder + @Below_SortOrder)/2
END
ELSE BEGIN
SET @IsTargetDescendant = 0
IF @Target_AncestorNavMenuID IS NOT NULL BEGIN
SELECT @IsTargetDescendant = 1
FROM #TargetDescendants
WHERE NavMenuID = @InMoveNavMenuID
END
IF @IsTargetDescendant = 1 OR @InMoveLevel = 'Lower' BEGIN
IF @NavContentGroupInd = 'N'
SELECT TOP 1 @Below_SortOrder = SortOrder
FROM Nav_Menu
WHERE SortOrder > @Target_SortOrder
AND WebsiteKey = @WebsiteKey
ORDER BY SortOrder
ELSE
SELECT TOP 1 @Below_SortOrder = SortOrder
FROM Nav_Menu
WHERE SortOrder > @Target_SortOrder
AND NavContentGroupInd = @NavContentGroupInd
ORDER BY SortOrder
END
print 'case 6'
SET @New_ParentNavMenuID = @InTargetNavMenuID
SET @New_AncestorNavMenuID = @Target_AncestorNavMenuID
SET @New_CategoryDepth = @Target_CategoryDepth + 1
SET @New_SortOrder = (@Target_SortOrder + @Below_SortOrder) /2
END
END
END
UPDATE Nav_Menu
SET ParentNavMenuID = @New_ParentNavMenuID,
AncestorNavMenuID = @New_AncestorNavMenuID,
CategoryDepth = @New_CategoryDepth,
SortOrder = @New_SortOrder,
WorkflowStatusCode = 'W',
PublishedDateTime = NULL
WHERE NavMenuID = @InMoveNavMenuID
EXECUTE amsp_CMGetUniqueDirectoryName @InMoveNavMenuID, 1, NULL
IF IsNull(@New_ParentNavMenuID,0) <> IsNull(@Move_ParentNavMenuID,0)
EXEC amsp_CMUpdateNavProperties @Move_ParentNavMenuID
SET @Loop_LowestSortOrder = @New_SortOrder
SET @IncrementValue = (@Below_SortOrder - @Loop_LowestSortOrder) / (@DescendantCount + 2)
OPEN c_Descendant
FETCH NEXT FROM c_Descendant
INTO @Loop_NavMenuID,
@Loop_SortOrder
WHILE @@FETCH_STATUS = 0 BEGIN
UPDATE Nav_Menu
SET AncestorNavMenuID = @New_AncestorNavMenuID,
CategoryDepth = CategoryDepth + @New_CategoryDepth - @Move_CategoryDepth,
SortOrder = @Loop_LowestSortOrder + (@IncrementValue * @Counter),
WorkflowStatusCode = 'W',
PublishedDateTime = NULL
WHERE NavMenuID = @Loop_NavMenuID
EXECUTE amsp_CMGetUniqueDirectoryName @Loop_NavMenuID, 1, NULL
SET @Counter = @Counter + 1
FETCH NEXT FROM c_Descendant
INTO @Loop_NavMenuID,
@Loop_SortOrder
END
EXEC amsp_CMUpdateNavProperties @InMoveNavMenuID
FETCH FIRST FROM c_Descendant
INTO @Loop_NavMenuID,
@Loop_SortOrder
WHILE @@FETCH_STATUS = 0 BEGIN
EXEC amsp_CMUpdateNavProperties @Loop_NavMenuID
FETCH NEXT FROM c_Descendant
INTO @Loop_NavMenuID,
@Loop_SortOrder
END
CLOSE c_Descendant
DEALLOCATE c_Descendant
END
END
GO
GRANT EXECUTE ON [dbo].[amsp_CMMoveNavMenu] TO [IMIS]
GO